/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import model.pojo.Aluno;

/**
 *
 * @author Julio
 */
public final class AlunoDaoImpl implements AlunoDao {

    private ArrayList<Aluno> listaAluno;

    /**
     *Construtor da classe AlunoDaoImpl, carrega a lista com objeto alunos
     */
    public AlunoDaoImpl() {
        try {
            this.listaAluno = carregarAlunos();
        } catch (IOException e) {
        }
    }

    /**
     * @param alunos em uma lista
     * Este método atribui a lista passada como parametro na lista de aluno do objeto em questão 
     */
    @Override
    public void setAluno(ArrayList<Aluno> alunos) {
        this.listaAluno = alunos;
    }

    /**
     * Método utilizado para pegar a lista de Aluno
     * @return lista do tipo ArrayList<Aluno>
     */
    @Override
    public ArrayList<Aluno> getAluno() {
        return this.listaAluno;
    }

    /**
     * @param aluno Aluno
     * @return se conseguir adicionar o aluno retorna "True" se não retorna "False"
     */
    @Override
    public boolean addAluno(Aluno aluno) {
        if (listaAluno.contains(aluno)) {
            return false;
        } else {
            aluno.setId(novoId());
            this.listaAluno.add(aluno);
            return true;
        }
    }

    /**
     *
     * @param aluno Aluno
     * @return compara se existe um cpf de aulo igual ao cpf do aluno passado por parâmetro se sim retorna "True" se não "False"
     */
    public boolean contains(Aluno aluno) {
        Integer i;
        for (i = 0; i < this.listaAluno.size(); i++) {
            if (listaAluno.get(i).getCpf().equals(aluno.getCpf())) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @param alunos em uma lista
     * @throws IOException Lança exceção caso haja problema na abertura do arquivo
     */
    @Override
    public void salvarAluno(ArrayList<Aluno> alunos) throws IOException {
        try (FileWriter writer = new FileWriter("Alunos.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            int i;
            for (i = 0; i < alunos.size(); i++) {
                writer.write(alunos.get(i).getId() + ";" + alunos.get(i).getNome() + ";" + alunos.get(i).getCpf()
                        + ";" + alunos.get(i).getMatricula() + "\n");
            }
        }
    }

    /**
     *
     * @return Retorna a lista de alunos
     * @throws IOException Lança exceção caso não seja possível carregar a lista de alunos
     */
    @Override
    public ArrayList<Aluno> carregarAlunos() throws IOException {
        ArrayList<Aluno> list;
        list = new ArrayList<>();
        File file = new File("Alunos.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                Aluno aluno = new Aluno(Integer.parseInt(t[0]), t[1], t[2], t[3]);
                list.add(aluno);
            }
        }
        return list;
    }

    /**
     *
     * @return Retorna 0 caso lista de alunos vazia. Retorna o ID do novo elemento caso contrário.
     */
    @Override
    public Integer novoId() {
        if (listaAluno.isEmpty()) {
            return 0;
        }
        return listaAluno.get(listaAluno.size() - 1).getId() + 1;
    }

    /**
     *
     * @return Retorna 0 se a lista de alunos estiver vazia. Caso não esteja, retorna o ID do último elemento da lista.
     */
    @Override
    public Integer ultimoId() {
        if (listaAluno.isEmpty()) {
            return 0;
        }
        return listaAluno.get(listaAluno.size() - 1).getId();
    }

    /**
     *
     * @param matricula 
     * @return Busca o ID de um aluno através da matricula, caso encontre, retorna o ID, caso nãom retorna -1.
     */
    @Override
    public Integer buscaIdAlunoPorMatricula(String matricula) {
        Integer i;
        for (i = 0; i < listaAluno.size(); i++) {
            if (listaAluno.get(i).getMatricula().equals(matricula)) {
                return listaAluno.get(i).getId();
            }
        }
        return -1;
    }

    /**
     *
     * @param idAluno
     * @return Busca o ID do aluno pela matricula. Caso encontre retorna o ID, caso não, retorna -1.
     */
    @Override
    public Integer buscaIdAlunoPorMatricula(Integer idAluno) {
        Integer i;
        for (i = 0; i < listaAluno.size(); i++) {
            if (listaAluno.get(i).getId().equals(idAluno)) {
                return listaAluno.get(i).getId();
            }
        }
        return -1;
    }
    
}